//
//  WBStatusListViewModel.swift
//  练手微博
//
//  Created by yuency on 06/07/2017.
//  Copyright © 2017 ChickenMaster. All rights reserved.
//

import Foundation


///上拉刷新最大尝试次数
private let maxPullUpTryTimes = 3


/// 微博数据列表视图模型 负责微博数据处理 1.字典转模型 2.下拉上拉刷新数据处理
/*
 父类的选择
 - 如果类要使用 `KVC` 或者字典转模型框架设置对象,类就需要继承自 NSObject
 - 如果类知识包装一些代码(写了一些函数) 可以不用任何父类,好处:更加轻量级
 - 如果用 OC, 一律继承NSObject
 */
class WBStatusListViewModel {
    
    //微博模型数组懒加载
    lazy var statusList = [WBStatusModel]()
    
    ///上拉刷新错误次数
    private var pullUpErrorTime = 0
    
    
    func loadStatus(pullUp: Bool, completion: @escaping (_ isSuccess: Bool, _ shouldRefresh: Bool)->()) {
        
        //判断是否是上拉加载,同时检查刷新错误
        if pullUp && (pullUpErrorTime > maxPullUpTryTimes) {
            completion(false,false)
            return
        }
        
        
        //下拉刷新,取出数组的第一条微博的 id
        let since_id = pullUp ? 0 : (statusList.first?.id ?? 0)
        //上拉刷新,取出数组的最后一条微博的 id
        let max_id = !pullUp ? 0 : (statusList.last?.id ?? 0)
        
        
        
        //下面是个尾随闭包
        WBNetworkManager.shared.statusList(since_id: since_id, max_id: max_id) { (list, isSuccess) in
            
            //字典转模型
            guard let array = NSArray.yy_modelArray(with: WBStatusModel.self, json: list) as? [WBStatusModel] else {
                completion(isSuccess,false)
                return
            }
            
            if pullUp {
                //上拉刷新
                self.statusList += array
            } else {
                //下拉刷新拼接数组,新刷新的东西放在前面, 这么写
                self.statusList = array + self.statusList
            }
            
            //判断上拉刷新的数据量
            if pullUp && array.count == 0 {
                self.pullUpErrorTime += 1
                completion(isSuccess,false)
            } else {
                //完成回调
                completion(isSuccess,true)
            }
        }
    }
}
